import pytest
import allure
from playwright.sync_api import Page, expect
import os
from datetime import datetime
from login_test import take_screenshot

@pytest.fixture(scope="function", autouse=True)
def setup_teardown(page: Page):
    page.set_viewport_size({"width": 1920, "height": 1080})
    yield
    if pytest.current_test.failed:
        take_screenshot(page, f"failed_{pytest.current_test.name}")

@allure.feature("注册功能")
@allure.story("用户注册")
class TestRegister:
    
    @allure.title("测试注册页面基本元素")
    @allure.severity(allure.severity_level.NORMAL)
    def test_register_page_elements(self, page: Page):
        """测试注册页面的基本元素是否存在"""
        with allure.step("导航到注册页面"):
            page.goto("http://localhost:8080/register")
        
        with allure.step("检查页面标题"):
            expect(page.locator("h2")).to_have_text("用户注册")
        
        with allure.step("检查所有输入字段"):
            expect(page.locator('input[placeholder="请输入用户名"]')).to_be_visible()
            expect(page.locator('input[placeholder="请输入密码"]')).to_be_visible()
            expect(page.locator('input[placeholder="请确认密码"]')).to_be_visible()
            expect(page.locator('input[placeholder="请输入邮箱"]')).to_be_visible()
            expect(page.locator('input[placeholder="请输入手机号"]')).to_be_visible()
        
        with allure.step("检查按钮"):
            expect(page.get_by_role("button", name="注册")).to_be_visible()
            expect(page.get_by_role("button", name="重置")).to_be_visible()
        
        with allure.step("检查返回登录链接"):
            expect(page.get_by_text("返回登录")).to_be_visible()

    @allure.title("测试成功注册场景")
    @allure.severity(allure.severity_level.CRITICAL)
    def test_successful_registration(self, page: Page):
        """测试成功注册场景"""
        with allure.step("导航到注册页面"):
            page.goto("http://localhost:8080/register")
        
        with allure.step("填写注册表单"):
            page.locator('input[placeholder="请输入用户名"]').fill("newuser")
            page.locator('input[placeholder="请输入密码"]').fill("Password123!")
            page.locator('input[placeholder="请确认密码"]').fill("Password123!")
            page.locator('input[placeholder="请输入邮箱"]').fill("newuser@example.com")
            page.locator('input[placeholder="请输入手机号"]').fill("13800138000")
        
        with allure.step("点击注册按钮"):
            page.get_by_role("button", name="注册").click()
        
        with allure.step("等待成功提示"):
            success_message = page.locator('.el-message--success')
            expect(success_message).to_be_visible()
        
        with allure.step("验证是否跳转到登录页面"):
            page.wait_for_url("**/login")

    @allure.title("测试密码不匹配场景")
    @allure.severity(allure.severity_level.NORMAL)
    def test_password_mismatch(self, page: Page):
        """测试密码不匹配场景"""
        with allure.step("导航到注册页面"):
            page.goto("http://localhost:8080/register")
        
        with allure.step("填写不匹配的密码"):
            page.locator('input[placeholder="请输入用户名"]').fill("testuser")
            page.locator('input[placeholder="请输入密码"]').fill("Password123!")
            page.locator('input[placeholder="请确认密码"]').fill("DifferentPassword!")
            page.locator('input[placeholder="请输入邮箱"]').fill("test@example.com")
            page.locator('input[placeholder="请输入手机号"]').fill("13800138000")
        
        with allure.step("点击注册按钮"):
            page.get_by_role("button", name="注册").click()
        
        with allure.step("验证错误提示"):
            error_message = page.locator('.el-message--error')
            expect(error_message).to_be_visible()
            expect(error_message).to_contain_text("两次输入的密码不一致")

    @allure.title("测试无效邮箱格式场景")
    @allure.severity(allure.severity_level.NORMAL)
    def test_invalid_email_format(self, page: Page):
        """测试无效邮箱格式场景"""
        with allure.step("导航到注册页面"):
            page.goto("http://localhost:8080/register")
        
        with allure.step("填写无效邮箱格式"):
            page.locator('input[placeholder="请输入用户名"]').fill("testuser")
            page.locator('input[placeholder="请输入密码"]').fill("Password123!")
            page.locator('input[placeholder="请确认密码"]').fill("Password123!")
            page.locator('input[placeholder="请输入邮箱"]').fill("invalid-email")
            page.locator('input[placeholder="请输入手机号"]').fill("13800138000")
        
        with allure.step("点击注册按钮"):
            page.get_by_role("button", name="注册").click()
        
        with allure.step("验证错误提示"):
            error_message = page.locator('.el-message--error')
            expect(error_message).to_be_visible()
            expect(error_message).to_contain_text("请输入正确的邮箱格式")

    @allure.title("测试无效手机号格式场景")
    @allure.severity(allure.severity_level.NORMAL)
    def test_invalid_phone_format(self, page: Page):
        """测试无效手机号格式场景"""
        with allure.step("导航到注册页面"):
            page.goto("http://localhost:8080/register")
        
        with allure.step("填写无效手机号格式"):
            page.locator('input[placeholder="请输入用户名"]').fill("testuser")
            page.locator('input[placeholder="请输入密码"]').fill("Password123!")
            page.locator('input[placeholder="请确认密码"]').fill("Password123!")
            page.locator('input[placeholder="请输入邮箱"]').fill("test@example.com")
            page.locator('input[placeholder="请输入手机号"]').fill("123")  # 无效的手机号
        
        with allure.step("点击注册按钮"):
            page.get_by_role("button", name="注册").click()
        
        with allure.step("验证错误提示"):
            error_message = page.locator('.el-message--error')
            expect(error_message).to_be_visible()
            expect(error_message).to_contain_text("请输入正确的手机号格式")

    @allure.title("测试表单重置功能")
    @allure.severity(allure.severity_level.MINOR)
    def test_reset_form(self, page: Page):
        """测试表单重置功能"""
        with allure.step("导航到注册页面"):
            page.goto("http://localhost:8080/register")
        
        with allure.step("填写表单"):
            page.locator('input[placeholder="请输入用户名"]').fill("testuser")
            page.locator('input[placeholder="请输入密码"]').fill("Password123!")
            page.locator('input[placeholder="请确认密码"]').fill("Password123!")
            page.locator('input[placeholder="请输入邮箱"]').fill("test@example.com")
            page.locator('input[placeholder="请输入手机号"]').fill("13800138000")
        
        with allure.step("点击重置按钮"):
            page.get_by_role("button", name="重置").click()
        
        with allure.step("验证所有字段都被清空"):
            expect(page.locator('input[placeholder="请输入用户名"]')).to_have_value("")
            expect(page.locator('input[placeholder="请输入密码"]')).to_have_value("")
            expect(page.locator('input[placeholder="请确认密码"]')).to_have_value("")
            expect(page.locator('input[placeholder="请输入邮箱"]')).to_have_value("")
            expect(page.locator('input[placeholder="请输入手机号"]')).to_have_value("")

    @allure.title("测试返回登录页面链接")
    @allure.severity(allure.severity_level.MINOR)
    def test_navigation_to_login(self, page: Page):
        """测试返回登录页面链接"""
        with allure.step("导航到注册页面"):
            page.goto("http://localhost:8080/register")
        
        with allure.step("点击返回登录链接"):
            page.get_by_text("返回登录").click()
        
        with allure.step("验证是否返回到登录页面"):
            page.wait_for_url("**/login") 